package cn.dt70.utils;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

public class InterestRatesBefore {

    /**
     * 先息后本计算获取还款方式为前期只还利息，最后一个月还本金和利息
     * <p>
     * 公式：前期每月偿还金=贷款本金×月利率
     *      最后一期偿还金=贷款本金+贷款本金×月利率
     *
     * @param invest        总借款额（贷款本金）
     * @param yearRate      年利率
     * @param totalMonth    还款总月数
     * @return 每月偿还利息，最后一期偿还本金和利息, 不四舍五入，直接截取小数点最后两位
     */

    public static Map<Integer, Double> getPerMonthPrincipalInterest(double invest, double yearRate, int totalMonth) {
        Map<Integer, Double> map = new HashMap<Integer, Double>();
        // 获取月利率
        double monthRate = yearRate / 12;
        monthRate = new BigDecimal(monthRate).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
        for (int i = 1; i <= totalMonth; i++) {
            double monthRes = 0;
            if(i != totalMonth){
                monthRes = invest * monthRate;
            }else{
                monthRes = invest * monthRate + invest;
            }
            monthRes = new BigDecimal(monthRes).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
            map.put(i, monthRes);
        }
        return map;
    }

    /**
     * 先息后本计算获取还款方式为前期只还利息，最后一个月还本金和利息
     * <p>
     * 公式：前期每月偿还金=贷款本金×月利率
     *      最后一期偿还金=贷款本金+贷款本金×月利率
     *
     * @param invest        总借款额（贷款本金）
     * @param yearRate      年利率
     * @param totalMonth    还款总月数
     * @return 每月偿还利息,不四舍五入，直接截取小数点最后两位
     */
    public static Map<Integer, Double> getPerMonthInterest(double invest, double yearRate, int totalMonth) {
        Map<Integer, Double> inMap = new HashMap<Integer, Double>();
        for (int i = 1; i <= totalMonth; i++) {
            double monthRate = yearRate / 12;
            monthRate = new BigDecimal(monthRate).setScale(6, BigDecimal.ROUND_HALF_UP).doubleValue();
            double monthRes = invest * monthRate ;
            monthRes = new BigDecimal(monthRes).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
            inMap.put(i,monthRes);
        }
        return inMap;
    }

    /**
     * 先息后本计算获取还款方式为前期只还利息，最后一个月还本金和利息
     * <p>
     * 公式：前期每月偿还金=贷款本金×月利率
     *      最后一期偿还金=贷款本金+贷款本金×月利率
     *
     * @param invest        总借款额（贷款本金）
     * @param yearRate      年利率
     * @param totalMonth    还款总月数
     * @return 利息总和
     */
    public static double getInterestCount(double invest, double yearRate, int totalMonth) {
        BigDecimal count = new BigDecimal(0);
        Map<Integer, Double> mapInterest = getPerMonthInterest(invest, yearRate, totalMonth);

        for (Map.Entry<Integer, Double> entry : mapInterest.entrySet()) {
            count = count.add(new BigDecimal(entry.getValue()));
        }
        return count.doubleValue();
    }

    /**
     * args
     */
    public static void main(String[] args) {
        double invest = 130000; // 本金
        int month = 3;
        double yearRate = 0.094; // 年利率
        Map<Integer, Double> getPerMonthPrincipalInterest = getPerMonthPrincipalInterest(invest, yearRate, month);
        System.out.println("等额本金---每月本息：" + getPerMonthPrincipalInterest);
        Map<Integer, Double> mapInterest = getPerMonthInterest(invest, yearRate, month);
        System.out.println("等额本金---每月利息:" + mapInterest);
        double count = getInterestCount(invest, yearRate, month);
        System.out.println("等额本金---总利息：" + count);
    }
}
